package br.com.mtech.ctrlliberty.clientjar.entity;

import java.io.Serializable;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.apache.commons.lang.time.DateFormatUtils;

@Entity
@Table(name="tbLigacao")
@SequenceGenerator(name="sqLigacao", sequenceName="sqLigacao", allocationSize=10)
public class LigacaoVO implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@Id
	@Column(name="idLigacao")
	@GeneratedValue(generator="sqLigacao", strategy=GenerationType.SEQUENCE)
	private Long id;
	
	@Column(name="nuDddRemoto")
	private String numeroDDDRemoto;
	
	@Column(name="nuRemoto")
	private Long numeroRemoto;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name="dtLigacaoInicial")
	private Calendar dataInicioLigacao;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name="dtLigacaoFinal")
	private Calendar dataFinalLigacao;
	
	@Enumerated
	@Column(name="idTipoLigacao")
	private TipoLigacaoEnum tipoLigacao;
	
	@OneToOne(fetch=FetchType.EAGER, cascade={CascadeType.ALL})
	@JoinColumn(name="idCoordenada")
	private CoordenadaGPSVO coordenada;
	
	@ManyToOne
	@JoinColumn(name="idTelefone")
	private TelefoneVO telefone;
	
	public LigacaoVO() {
		
	}
	
	public LigacaoVO(String numeroDDD, Long numeroRemoto, Calendar dataInicial, Calendar dataFinal, TipoLigacaoEnum tipoLigacao, CoordenadaGPSVO coordenada) {
		this.numeroDDDRemoto = numeroDDD;
		this.numeroRemoto = numeroRemoto;
		this.dataInicioLigacao = dataInicial;
		this.dataFinalLigacao = dataFinal;
		this.tipoLigacao = tipoLigacao;
		this.coordenada = coordenada;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNumeroDDDRemoto() {
		return numeroDDDRemoto;
	}

	public void setNumeroDDDRemoto(String numeroDDDRemoto) {
		this.numeroDDDRemoto = numeroDDDRemoto;
	}

	public Long getNumeroRemoto() {
		return numeroRemoto;
	}
	
	public String getNumeroRemotoFormatado() {
		String numeroFormatado = Long.toString(numeroRemoto);
		return numeroFormatado.substring(0,4) + "-" + numeroFormatado.substring(4);
	}

	public void setNumeroRemoto(Long numeroRemoto) {
		this.numeroRemoto = numeroRemoto;
	}
	
	public Calendar getDataInicioLigacao() {
		return dataInicioLigacao;
	}

	public void setDataInicioLigacao(Calendar dataInicioLigacao) {
		this.dataInicioLigacao = dataInicioLigacao;
	}

	public Calendar getDataFinalLigacao() {
		return dataFinalLigacao;
	}

	public void setDataFinalLigacao(Calendar dataFinalLigacao) {
		this.dataFinalLigacao = dataFinalLigacao;
	}

	public TipoLigacaoEnum getTipoLigacao() {
		return tipoLigacao;
	}

	public void setTipoLigacao(TipoLigacaoEnum tipoLigacao) {
		this.tipoLigacao = tipoLigacao;
	}

	public CoordenadaGPSVO getCoordenada() {
		return coordenada;
	}

	public void setCoordenada(CoordenadaGPSVO coordenada) {
		this.coordenada = coordenada;
	}

	public TelefoneVO getTelefone() {
		return telefone;
	}

	public void setTelefone(TelefoneVO telefone) {
		this.telefone = telefone;
	}
	
	public Date getDuracaoLigacao(){

		DateFormat df = new SimpleDateFormat("HH:mm:ss:SSS");
		
		Date diferenca = null;
		try {
			diferenca = df.parse(DateFormatUtils.formatUTC(getDataFinalLigacao().getTimeInMillis() - getDataInicioLigacao().getTimeInMillis(), "HH:mm:ss:SSS"));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		return diferenca;
		
	}
	
	public Double getDuracaLigacaoEmMinutos() {
		if( getDataInicioLigacao() != null && getDataFinalLigacao() != null) {						
			return new Double(((getDataFinalLigacao().getTimeInMillis() - getDataInicioLigacao().getTimeInMillis())/1000.0)/60.0);
		} else {
			return new Double("0.0");
		}
	}
	
	public DiaDaSemanaEnum getDiaLigacao() {
			
		return DiaDaSemanaEnum.getInstance(getDataInicioLigacao().get(Calendar.DAY_OF_WEEK));
	}
	
}
